<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
<meta name="viewport"
      content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">

    <meta name="author" content="豆豆">


    <meta name="subtitle" content="愿望是实现睡觉自由">


    <meta name="description" content="你来啦，这里是豆豆的小笔记！">


    <meta name="keywords" content="豆豆,学习,小笔记,睡觉自由">


<title>「AI_03」回归 | 豆豆的小笔记</title>



    <link rel="icon" href="/favicon.ico">




    <!-- stylesheets list from _config.yml -->
    
    <link rel="stylesheet" href="/css/style.css">
    



    <!-- scripts list from _config.yml -->
    
    <script src="/js/script.js"></script>
    
    <script src="/js/tocbot.min.js"></script>
    



    
    
        
            <!-- MathJax配置，可通过单美元符号书写行内公式等 -->
<script type="text/x-mathjax-config">
    MathJax.Hub.Config({
    "HTML-CSS": {
        preferredFont: "TeX",
        availableFonts: ["STIX","TeX"],
        linebreaks: { automatic:true },
        EqnChunk: (MathJax.Hub.Browser.isMobile ? 10 : 50)
    },
    tex2jax: {
        inlineMath: [ ["$", "$"], ["\\(","\\)"] ],
        processEscapes: true,
        ignoreClass: "tex2jax_ignore|dno",
        skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
    },
    TeX: {
        equationNumbers: { autoNumber: "AMS" },
        noUndefined: { attributes: { mathcolor: "red", mathbackground: "#FFEEEE", mathsize: "90%" } },
        Macros: { href: "{}" }
    },
    messageStyle: "none"
    });
</script>
<!-- 给MathJax元素添加has-jax class -->
<script type="text/x-mathjax-config">
    MathJax.Hub.Queue(function() {
        var all = MathJax.Hub.getAllJax(), i;
        for(i=0; i < all.length; i += 1) {
            all[i].SourceElement().parentNode.className += ' has-jax';
        }
    });
</script>
<!-- 通过连接CDN加载MathJax的js代码 -->
<script type="text/javascript" async
        src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML">
</script>


        
    


<meta name="generator" content="Hexo 4.2.0"></head>
<body>
    <div class="wrapper">
        <header>
    <nav class="navbar">
        <div class="container">
            <div class="navbar-header header-logo"><a href="/">豆豆的小笔记</a></div>
            <div class="menu navbar-right">
                
                    <a class="menu-item" href="/archives">归档</a>
                
                    <a class="menu-item" href="/category">分类</a>
                
                    <a class="menu-item" href="/tag">标签</a>
                
                    <a class="menu-item" href="/about">关于</a>
                
                <input id="switch_default" type="checkbox" class="switch_default">
                <label for="switch_default" class="toggleBtn"></label>
            </div>
        </div>
    </nav>

    
    <nav class="navbar-mobile" id="nav-mobile">
        <div class="container">
            <div class="navbar-header">
                <div>
                    <a href="/">豆豆的小笔记</a><a id="mobile-toggle-theme">·&nbsp;纯白</a>
                </div>
                <div class="menu-toggle" onclick="mobileBtn()">&#9776; 菜单</div>
            </div>
            <div class="menu" id="mobile-menu">
                
                    <a class="menu-item" href="/archives">归档</a>
                
                    <a class="menu-item" href="/category">分类</a>
                
                    <a class="menu-item" href="/tag">标签</a>
                
                    <a class="menu-item" href="/about">关于</a>
                
            </div>
        </div>
    </nav>

</header>
<script>
    var mobileBtn = function f() {
        var toggleMenu = document.getElementsByClassName("menu-toggle")[0];
        var mobileMenu = document.getElementById("mobile-menu");
        if(toggleMenu.classList.contains("active")){
           toggleMenu.classList.remove("active")
            mobileMenu.classList.remove("active")
        }else{
            toggleMenu.classList.add("active")
            mobileMenu.classList.add("active")
        }
    }
</script>
        <div class="main">
            <div class="container">
    
    
        <div class="post-toc">
    <div class="tocbot-list">
    </div>
    <div class="tocbot-list-menu">
        <a class="tocbot-toc-expand" onclick="expand_toc()">展开所有</a>
        <a onclick="go_top()">回到顶部</a>
        <a onclick="go_bottom()">到达底部</a>
    </div>
</div>

<script>
    document.ready(
        function () {
            tocbot.init({
                tocSelector: '.tocbot-list',
                contentSelector: '.post-content',
                headingSelector: 'h1, h2, h3, h4, h5',
                collapseDepth: 1,
                orderedList: false,
                scrollSmooth: true,
            })
        }
    )

    function expand_toc() {
        var b = document.querySelector(".tocbot-toc-expand");
        tocbot.init({
            tocSelector: '.tocbot-list',
            contentSelector: '.post-content',
            headingSelector: 'h1, h2, h3, h4, h5',
            collapseDepth: 6,
            orderedList: false,
            scrollSmooth: true,
        });
        b.setAttribute("onclick", "collapse_toc()");
        b.innerHTML = "收起所有"
    }

    function collapse_toc() {
        var b = document.querySelector(".tocbot-toc-expand");
        tocbot.init({
            tocSelector: '.tocbot-list',
            contentSelector: '.post-content',
            headingSelector: 'h1, h2, h3, h4, h5',
            collapseDepth: 1,
            orderedList: false,
            scrollSmooth: true,
        });
        b.setAttribute("onclick", "expand_toc()");
        b.innerHTML = "展开所有"
    }

    function go_top() {
        window.scrollTo(0, 0);
    }

    function go_bottom() {
        window.scrollTo(0, document.body.scrollHeight);
    }

</script>
    

    
    <article class="post-wrap">
        <header class="post-header">
            <h1 class="post-title">「AI_03」回归</h1>
            
                <div class="post-meta">
                    

                    
                        <span class="post-time">
                        时间： <a href="#">三月 12, 2017&nbsp;&nbsp;18:36:57</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                        </span>
                    
                    
                        <span class="post-category">
                    分类：
                            
                                <a href="/categories/AI/">AI</a>
                            
                        </span>
                    
                </div>
            
        </header>

        <div class="post-content">
            <h1 id="回归"><a href="#回归" class="headerlink" title="回归"></a>回归</h1><h2 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h2><p>Regression就是找到一个函数function，通过输入特征 $x$，输出一个数值Scalar。</p>
<h2 id="应用举例"><a href="#应用举例" class="headerlink" title="应用举例"></a>应用举例</h2><ul>
<li>股市预测（Stock market forecast）<ul>
<li>输入：过去10年股票的变动、新闻咨询、公司并购咨询等</li>
<li>输出：预测股市明天的平均值</li>
</ul>
</li>
<li>自动驾驶（Self-driving Car）<ul>
<li>输入：无人车上的各个sensor的数据，例如路况、测出的车距等</li>
<li>输出：方向盘的角度</li>
</ul>
</li>
<li>商品推荐（Recommendation）<ul>
<li>输入：商品A的特性，商品B的特性</li>
<li>输出：购买商品B的可能性</li>
</ul>
</li>
<li>Pokemon精灵攻击力预测（Combat Power of a pokemon）：<ul>
<li>输入：进化前的CP值、物种（Bulbasaur）、血量（HP）、重量（Weight）、高度（Height）</li>
<li>输出：进化后的CP值</li>
</ul>
</li>
</ul>
<h1 id="应用示例"><a href="#应用示例" class="headerlink" title="应用示例"></a>应用示例</h1><ul>
<li>第一步：模型假设，选择模型框架（线性模型）</li>
<li>第二步：模型评估，如何判断众多模型的好坏（损失函数）</li>
<li>第三步：模型优化，如何筛选最优的模型（梯度下降）</li>
</ul>
<blockquote>
<p>评估宝可梦的<strong>CP值（战斗力）</strong>，从而判断是否进化宝可梦.</p>
<p>输入是某只宝可梦：</p>
<ul>
<li>$x$代表宝可梦.</li>
<li>$x_{cp}$代表宝可梦的<strong>CP值</strong>.</li>
<li>$x_s$代表宝可梦的<strong>物种</strong>.</li>
<li>$x_{hp}$代表宝可梦的<strong>生命值</strong>.</li>
<li>$x_w$代表宝可梦的<strong>重量</strong>.</li>
<li>$x_h$代表宝可梦的<strong>高度</strong>.</li>
<li>$y$代表<strong>进化后的CP值</strong>.</li>
</ul>
</blockquote>
<h2 id="第一步-模型"><a href="#第一步-模型" class="headerlink" title="第一步 | 模型"></a>第一步 | 模型</h2><h3 id="一元线性模型-单个特征"><a href="#一元线性模型-单个特征" class="headerlink" title="一元线性模型 | 单个特征"></a>一元线性模型 | 单个特征</h3><p>以一个特征 $x_{cp}$ 为例，线性模型假设 $y = b + w·x_{cp}$ ，所以 $w$ 和 $b$ 可以猜测很多模型：<br>$$<br>f_1: y = 10.0 + 9.0·x_{cp} \<br>f_2: y = 9.8 + 9.2·x_{cp} \<br>f_3: y = - 0.8 - 1.2·x_{cp} \<br>···<br>$$</p>
<p>虽然可以做出很多假设，但在这个例子中，显然 $f_3: y = - 0.8 - 1.2·x_{cp}$ 的假设是不合理的，不能进化后CP值是个负值。</p>
<h3 id="多元线性模型-多个特征"><a href="#多元线性模型-多个特征" class="headerlink" title="多元线性模型 | 多个特征"></a>多元线性模型 | 多个特征</h3><p>在实际应用中，输入特征肯定不止 $x_{cp}$ 这一个。例如，进化前的CP值、物种（Bulbasaur）、血量（HP）、重量（Weight）、高度（Height）等，特征会有很多。</p>
<p><img src="chapter3-1.png" alt=""></p>
<p>例如选择：<br>$$<br>y = b + w \cdot x_{cp}<br>$$</p>
<blockquote>
<p>线性模型：<br>$$<br>y = b + \sum w_i x_i<br>$$<br>其中：</p>
<ul>
<li>$x_i$是输入的不同属性，称为<strong>特征</strong>.</li>
<li>$w_i$是每个特征对应的<strong>权重</strong>.</li>
<li>$b$称为<strong>偏置</strong>.</li>
</ul>
</blockquote>
<h2 id="第二步-模型性能"><a href="#第二步-模型性能" class="headerlink" title="第二步 | 模型性能"></a>第二步 | 模型性能</h2><h3 id="收集和查看训练数据"><a href="#收集和查看训练数据" class="headerlink" title="收集和查看训练数据"></a>收集和查看训练数据</h3><p>接下来要收集<strong>训练数据</strong>才能找到模型的函数.</p>
<p>我们收集的是模型的输入和输出，因为是一个回归的模型，所以<strong>输出是一个数值</strong>.</p>
<p>举例来说（用<strong>上标</strong>表示<strong>完整的对象的编号</strong>，用<strong>下标</strong>表示对象的<strong>成分</strong>）：</p>
<ul>
<li>杰尼龟$x^1$进化到卡咪龟$\hat{y}^1=979$.</li>
<li>伊布$x^2$进化到雷精灵$\hat{y}^2=1420$.</li>
</ul>
<p><img src="chapter3-2.png" alt=""></p>
<p>由此，收集了10只宝可梦的数据：<br>$$<br>(x^1,\hat{y}^1), (x^2,\hat{y}^2), \dots ,(x^{10},\hat{y}^{10})<br>$$<br>可以绘制出来一张$x_{cp}-\hat{y}$的散点图。</p>
<p><img src="chapter3-3.png" alt=""></p>
<h3 id="如何判断众多模型的好坏"><a href="#如何判断众多模型的好坏" class="headerlink" title="如何判断众多模型的好坏"></a>如何判断众多模型的好坏</h3><p><img src="chapter3-4.png" alt=""></p>
<blockquote>
<p>接下来要判断不同函数的好坏，这里需要定义一个新的函数<strong>损失函数$L$</strong>，这是一个函数的函数：</p>
<ul>
<li>输入：一个函数.</li>
<li>输出：这个函数有<strong>多不好</strong>.</li>
</ul>
<p>$$<br>L(f) = L(w,b)<br>$$</p>
<p>因为$f$是由$w, b$决定的，所以我们可以说损失函数是用来衡量一组参数的好坏.</p>
<p>实际上可以选择不同的损失函数的形式，这里就将数据带入到$y = b + w \cdot x_{cp}$中，然后计算差的平方和，即：<br>$$<br>L(f) = L(w,b) = \sum_{n=1}^{10} (\hat{y}^n - (b + w \cdot x_{cp}^n))^2<br>$$</p>
</blockquote>
<p>我们将 $w$, $b$ 在二维坐标图中展示，如图所示：</p>
<p><img src="chapter3-5.png" alt=""></p>
<ul>
<li>图中每一个点代表着一个模型对应的 $w$ 和 $b$</li>
<li>颜色越深代表模型更优</li>
</ul>
<p>可以与后面的图11（等高线）进行对比</p>
<h2 id="第三步-最优模型"><a href="#第三步-最优模型" class="headerlink" title="第三步 | 最优模型"></a>第三步 | 最优模型</h2><blockquote>
<p>根据损失函数来挑选最好的方程<br>$$<br>f^* = \arg \min_f L(f)<br>$$<br>或<br>$$<br>\begin{align}<br>w^* , b^* &amp; = \arg \min_{w,b} L(w, b) \\<br>&amp; = \arg \min_{w,b} \sum_{n=1}^{10} (\hat{y}^n - (b + w \cdot x_{cp}^n))^2<br>\end{align}<br>$$<br>从中选择能够使得损失函数最好的$w,b$参数.</p>
</blockquote>
<p><img src="chapter3-6.png" alt=""></p>
<h3 id="梯度下降法"><a href="#梯度下降法" class="headerlink" title="梯度下降法"></a>梯度下降法</h3><p>这里使用<strong>梯度下降法（Gradient Descent）</strong>来处理优化问题.</p>
<p>先假设一个比较简单的损失函数$L(w)$，只包含一个参数$w$.不一定是前面定义的损失函数，可以是任何<strong>可微分</strong>的函数.</p>
<p>现在的问题就是：<br>$$<br>w^* = \arg \min_w L(w)<br>$$<br><img src="chapter3-7.png" alt=""></p>
<p>梯度下降法的做法：</p>
<ol>
<li><strong>随机</strong>选取一个初始的点$w^0$.</li>
<li>计算$\frac{dL}{dw}|_{w=w^0}$，如果算出来斜率是负值，就应该增大$w$；如果计算出来斜率是正值，就应该减小$w$.</li>
<li>参数更新，$w^0 - \eta \frac{dL}{dw}|_{w=w^0} \rightarrow w^1$，其中$\eta$称为学习率.</li>
<li>依次迭代2和3步.</li>
</ol>
<p><img src="chapter3-8.png" alt=""></p>
<p>解释完单个模型参数$w$，引入2个模型参数 $w$ 和 $b$ ， 其实过程是类似的，需要做的是偏微分，过程如图9所示。</p>
<p><img src="chapter3-9.png" alt=""></p>
<blockquote>
<p>推广到两个参数，步骤是一样的：</p>
<ol>
<li><strong>随机</strong>选取一个初始的点$w^0,b^0$.</li>
<li>计算$ \frac{\partial L}{\partial w}|_{w=w^0,b=b^0},\frac{\partial L}{\partial b}|_{w=w^0,b=b^0}$.</li>
<li>参数更新$ w^0 - \eta \frac{\partial L}{\partial w}|_{w=w^0,b=b^0} \rightarrow w^1,b^0 - \eta \frac{\partial L}{\partial b}|_{w=w^0,b=b^0} \rightarrow b^1$.</li>
<li>依次迭代2和3步.</li>
</ol>
<p><strong>注意</strong>：线性回归中，损失函数是<strong>凸函数</strong>，所以局部最优解就是全局最优解.</p>
</blockquote>
<p>整理成一个更简洁的公式：</p>
<p><img src="chapter3-10.png" alt=""></p>
<h2 id="结果"><a href="#结果" class="headerlink" title="结果"></a>结果</h2><p>求误差之和来评估模型的性能：<br>$$<br>e_{avg} = \sum_{n=1}^{10} e^n<br>$$<br>原来数据的$e_{avg} = 31.9$，又捕捉了10只新的宝可梦，计算$e_{avg} = 35.0$.</p>
<h3 id="梯度下降算法在现实世界中面临的挑战"><a href="#梯度下降算法在现实世界中面临的挑战" class="headerlink" title="梯度下降算法在现实世界中面临的挑战"></a>梯度下降算法在现实世界中面临的挑战</h3><p>我们通过梯度下降gradient descent不断更新损失函数的结果，这个结果会越来越小，那这种方法找到的结果是否都是正确的呢？前面提到的当前最优问题外，还有没有其他存在的问题呢？</p>
<p><img src="chapter3-12.png" alt=""></p>
<p>其实还会有其他的问题：</p>
<ul>
<li>问题1：当前最优（Stuck at local minima）</li>
<li>问题2：等于0（Stuck at saddle point）</li>
<li>问题3：趋近于0（Very slow at the plateau）</li>
</ul>
<p><img src="chapter3-13.png" alt=""></p>
<p>注意：其实在线性模型里面都是一个碗的形状（山谷形状），梯度下降基本上都能找到最优点，但是再其他更复杂的模型里面，就会遇到 问题2 和 问题3 了</p>
<h2 id="选择其他模型-1元N次模型"><a href="#选择其他模型-1元N次模型" class="headerlink" title="选择其他模型 | 1元N次模型"></a>选择其他模型 | 1元N次模型</h2><h3 id="过拟合"><a href="#过拟合" class="headerlink" title="过拟合"></a>过拟合</h3><p>选择一个更加复杂的模型，带有<strong>二次项</strong>：<br>$$<br>y = b + w_1 \cdot x_{cp} + w_2 \cdot (x_{cp})^2<br>$$<br>甚至带有<strong>三次项</strong>：<br>$$<br>y = b + w_1 \cdot x_{cp} + w_2 \cdot (x_{cp})^2 + w_3 \cdot (x_{cp})^3<br>$$<br><strong>四次项</strong>：<br>$$<br>y = b + w_1 \cdot x_{cp} + w_2 \cdot (x_{cp})^2 + w_3 \cdot (x_{cp})^3 + w_4 \cdot (x_{cp})^4<br>$$<br>出现了<strong>过拟合</strong>.</p>
<p><img src="chapter3-18.png" alt=""></p>
<p><img src="chapter3-19.png" alt=""></p>
<p><img src="chapter3-20.png" alt=""></p>
<h3 id="优化方法1-用四个线性模型表示"><a href="#优化方法1-用四个线性模型表示" class="headerlink" title="优化方法1 | 用四个线性模型表示"></a>优化方法1 | 用四个线性模型表示</h3><p>通过对 Pokemons种类 判断，将<strong>4个线性模型</strong>合并到一个线性模型中</p>
<p><img src="chapter3-24.png" alt=""></p>
<p><img src="chapter3-25.png" alt=""></p>
<p><img src="chapter3-26.png" alt=""></p>
<h3 id="优化方法2-使用更多参数"><a href="#优化方法2-使用更多参数" class="headerlink" title="优化方法2 | 使用更多参数"></a>优化方法2 | 使用更多参数</h3><p>在最开始我们有很多特征，图形化分析特征，将血量（HP）、重量（Weight）、高度（Height）也加入到模型中</p>
<p><img src="chapter3-27.png" alt=""></p>
<p><img src="chapter3-28.png" alt=""></p>
<p>更多特征，更多input，数据量没有明显增加，仍旧导致overfitting</p>
<h3 id="优化方法3-加入正则化"><a href="#优化方法3-加入正则化" class="headerlink" title="优化方法3 | 加入正则化"></a>优化方法3 | 加入正则化</h3><p><img src="chapter3-29.png" alt=""></p>
<p><img src="chapter3-30.png" alt=""></p>
<blockquote>
<p>前面的损失函数只考虑了预测值和实际值之间的<strong>误差</strong>，正则化就是给损失函数加上额外的项.<br>$$<br>y = b + \sum w_i x_i<br>$$</p>
<p>$$<br>L = \sum_{n} (\hat{y}^n - (b + w \cdot x_{cp}^n))^2 + \lambda \sum (w_i)^2<br>$$</p>
</blockquote>
<ul>
<li>函数中$w_i$参数越小，函数越<strong>平滑</strong>的，函数对于输入变化不敏感，输入的变化对输出的变化影响很小，降低噪声干扰.</li>
<li>$\lambda$的数值越大，我们对$w_i$<strong>参数本身</strong>越关注，而减少了对误差的关注.我们可以手动调整$\lambda$的数值.</li>
<li>偏置$b$并不会影响函数的平滑程度，而只是让函数上下移动，所以正则化不用考虑偏置项.</li>
</ul>
<h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><ul>
<li><strong>Pokemon</strong>：原始的CP值极大程度的决定了进化后的CP值，但可能还有其他的一些因素。</li>
<li><strong>Gradient descent</strong>：梯度下降的做法；后面会讲到它的理论依据和要点。</li>
<li><strong>Overfitting和Regularization</strong>：过拟合和正则化，主要介绍了表象；后面会讲到更多这方面的理论。</li>
</ul>

        </div>

        
        <section class="post-tags">
            <div>
                <span>标签：</span>
                <span class="tag">
                    
                    
                        <a href="/tags/%E6%9D%8E%E5%AE%8F%E6%AF%85/"># 李宏毅</a>&nbsp;&nbsp;
                    
                        <a href="/tags/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/"># 机器学习</a>&nbsp;&nbsp;
                    
                        <a href="/tags/AI/"># AI</a>&nbsp;&nbsp;
                    
                        
                </span>
            </div>
            <div>
                <a href="javascript:window.history.back();">返回</a>
                <span>· </span>
                <a href="/">主页</a>
            </div>
        </section>
        <section class="post-nav">
            
                <a class="prev" rel="prev" href="/2017/03/13/ai-lhyML-04/">「AI_04」回归演示</a>
            
            
            <a class="next" rel="next" href="/2017/03/12/ai-lhyML-02/">「AI_02」为什么要学习机器学习</a>
            
        </section>


    </article>
</div>

        </div>
        <footer id="footer" class="footer">
    <div class="copyright">
        <span>© 豆豆 | Powered by <a href="https://hexo.io" target="_blank">Hexo</a> & <a href="https://github.com/Siricee/hexo-theme-Chic" target="_blank">Chic</a></span>
    </div>
</footer>


    <script src='https://unpkg.com/mermaid@7.1.2/dist/mermaid.min.js'></script>
    <script>
      if (window.mermaid) {
        mermaid.initialize({theme: 'neutral'});
      }
    </script>
  
    </div>
</body>
</html>
